import pandas as pd
import numpy as np
import os

# 确保文件路径正确
file_path = r'C:\Users\35744\Desktop\B题 洪水灾害的数据分析与预测\附件 B题 洪水灾害的数据分析与预测\train.csv'
if os.path.exists(file_path):
    print("文件存在，尝试读取。")
    # 读取数据文件
    data = pd.read_csv(file_path, encoding='gbk')

    # 缺失值检测并输出详细信息
    print("检测数据中的缺失值：")
    missing_data = data.isnull().sum()
    print(missing_data[missing_data > 0])  # 只显示存在缺失值的列
    print(f"总缺失值数量：{missing_data.sum()}")

    # 检测重复值
    print("检测数据中的重复行：")
    duplicates = data.duplicated().sum()
    print(f"总重复行数量：{duplicates}")

    # 遍历每个列，根据数据类型选择填充策略
    for column in data.columns:
        # 检查数据类型
        if data[column].dtype in [np.float64, np.int64]:  # 数值型数据
            # 直接赋值，避免链式赋值的警告
            data[column] = data[column].fillna(data[column].mean())
        else:  # 非数值型数据
            # 使用众数填充，取第一个众数
            data[column] = data[column].fillna(data[column].mode()[0])

    print("检测数据中的异常值：")
    # 处理异常值
    total_outliers = 0
    for column in data.select_dtypes(include=[np.number]).columns:
        Q1 = data[column].quantile(0.25)
        Q3 = data[column].quantile(0.75)
        IQR = Q3 - Q1
        # 使用布尔索引直接在原DataFrame上过滤异常值
        filter = (data[column] < Q1 - 1.5 * IQR) | (data[column] > Q3 + 1.5 * IQR)
        outliers_count = filter.sum()
        total_outliers += outliers_count
        data = data[~filter]
        print(f"{column} 列的异常值数量：{outliers_count}")

    print(f"总异常值数量：{total_outliers}")

    # 数据类型转换，例如日期
    if 'date_column' in data.columns:  # 假设存在日期列'date_column'
        data['date_column'] = pd.to_datetime(data['date_column'], errors='coerce')

    # 删除重复行
    data.drop_duplicates(inplace=True)

    # 显示处理后的数据概览
    print(data.head())  # 显示前几行数据以确认处理的结果

    # 定义保存文件的路径
    output_file_path = r'data.csv'

    # 将清洗后的数据保存为CSV文件，使用utf-8-sig编码以确保中文显示正常
    data.to_csv(output_file_path, index=False, encoding='utf-8-sig')
    print(f"清洗后的数据已保存到：{output_file_path}")
else:
    print("文件不存在，请检查路径。")


